home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / —‹Œêsrc.lzh / commander.c < prev    next >
C/C++ Source or Header  |  1993-02-07  |  27KB  |  635 lines

  1. #include    "3DDEF.H"
  2. #include    "GLOBAL.H"
  3. #include    "FORWARD.H"
  4. #include    "XCODE.H"
  5. #include    "FORWARD2.H"
  6.  
  7. /*
  8. #define    COMMAND_UNDER_BLANC_MASK    0x00000001    under_blanc する
  9. #define    COMMAND_ARG_LOOP_MASK        0x00000002    ループする
  10. #define    CHANGED_FLAG_MASK        0x00000004    無条件に変更が発生している
  11. */
  12. #define    TTIME_MASK            0x00000008    /* 変換中は実行してはならない */
  13. #define    MACRO_NOT_MASK            0x00000010    /* マクロ定義中は実行してはならない */
  14. #define    DO_CTRL_L            0x00000020    /* 実行後 ctrl_l で画面を書き直す */
  15. #define    DO_KEY_CLEAR            0x00000040    /* 実行後 fep_key_clear をかける */
  16. #define    OK_VIEW                0x00000100    /* view モードで実行して良い */
  17. #define    NO_DUMMY            0x00000200    /* ダミーモードでは実行できない */
  18.  
  19. /*
  20. void etc_ds();
  21. void etc_ds1();
  22. */
  23.  
  24. extern UWORD fep_xf_bind_table[MAX_XF];
  25.  
  26. /*
  27. #define    CURRENT_CHANGED    (TDATA[CURRENT_TEXT].CHANGED_FLAG)
  28. */
  29. #define    KIIRO_REV    10    /* 黄色のリバース */
  30.  
  31. int LCN;    /* Last Command Number */
  32. int commander_x;
  33. UWORD view_flag = 0;
  34.  
  35. COMMAND_UNIT command_table[MAX_COMMAND_NUMBER];
  36. COMMAND_UNIT command_table1[MAX_COMMAND_NUMBER];
  37. COMMAND_UNIT command_table0[MAX_COMMAND_NUMBER];
  38.  
  39. COMMAND_UNIT command_table10[MAX_COMMAND_NUMBER] = {
  40. {{0x201,0},0x00000109,ed_meta_b,"文頭へ"},            /* meta-B */
  41. {{0x202,0},0x0000010b,ed_meta_z,"文末へ"},            /* meta-Z */
  42. {{0x203,0},0x00000008,ed_meta_r,"置換"},            /* meta-R */
  43. {{0x204,0},0x00000108,ed_meta_n,"文末へ向かって文字列検索"},    /* meta-N */
  44. {{0x205,0},0x00000148,ed_ctrl_j_n,"文末へ向かって文字列検索"},    /* meta-N */
  45. {{0x206,0},0x00000108,ed_meta_space,"マークセット"},
  46. {{0x207,0},0x0000000a,ed_ctrl_j_ctrl_w,"範囲削除"},    /* F7 */
  47. {{0x208,0},0x0000000a,ed_ctrl_j_esc_w,"複写"},    /* F8 */
  48. {{0x209,0},0x0000000a,ed_ctrl_j_ctrl_y,"貼付"},    /* F9 */
  49. {{0x20a,0},0x00000008,ed_ctrl_j_2,"二重化"},    /* F10 */
  50. {{0x210,0},0x00000108,mouse_cursor,"マウスでカーソル移動"},
  51.  
  52. {{0x211,0},0x00000108,ed_meta_f,"新しいファイルの編集"},    /* meta-F */
  53. {{0x212,0},0x00000108,ed_meta_o,"現ファイルを編集前に戻す"},    /* meta-O */
  54. {{0x213,0},0x00000008,ed_meta_u,"文頭に向かって連続置換"},    /* meta-U */
  55. {{0x214,0},0x00000108,ed_meta_s,"文頭に向かって文字列検索"},    /* meta-S */
  56. {{0x215,0},0x00000148,ed_meta_s_next,"文頭に向かって文字列検索"},
  57. {{0x216,0},0x00000109,ed_meta_a,"ファイル切り替え(正順)"},    /* meta-A */
  58. {{0x217,0},0x00000109,ed_meta_d,"ファイル切り替え(逆順)"},    /* meta-D */
  59. {{0x218,0},0x00000008,ed_meta_y,"挿入ファイル読み込み"},        /* meta-Y */
  60. {{0x219,0},0x00000108,ed_meta_w,"一部取り出しファイル作成"},    /* meta-W */
  61. {{0x21a,0},0x00000108,ed_meta_c,"コマンドを実行"},        /* meta-C */
  62.  
  63. {{FEP_CLR_CODE,0},0x00000100,ed_ctrl_ubar,"生入力キャンセル"},
  64. {{FEP_UNDO_CODE,0},0x00000159,ed_ctrl_j_e,"マクロを実行"},
  65. {{FEP_HOME_CODE,0},0x0000010b,ed_ctrl_j_h,"ホーム"},
  66. {{FEP_HELP_CODE,0},0x00000118,ctrl_t_h,"ヘルプ"},
  67. {{FEP_HELP_CODE | 0x20,0},0x00000118,ctrl_shift_help,"キーバインド初期化"},
  68.  
  69. {{'\x00',0},0x0000000b,ed_ctrl_at,"なし"},        /* ^@ */
  70. {{'\x01',0},0x0000010b,ed_ctrl_a,"1ワード左へ"},    /* ^A */
  71. {{'\x02',0},0x00000103,ed_ctrl_b,"行頭⇔行末トグル"},    /* ^B */
  72. {{'\x03',0},0x0000010b,ed_ctrl_c,"下ページスクロール"},    /* ^C */
  73. {{'\x04',0},0x00000103,ed_ctrl_d,"右へ"},        /* ^D */
  74. {{'\x05',0},0x00000103,ed_ctrl_e,"上へ"},        /* ^E */
  75. {{'\x06',0},0x0000010b,ed_ctrl_f,"1ワード右へ"},    /* ^F */
  76. {{'\x07',0},0x0000000b,ed_ctrl_g,"吸い込み削除"},    /* ^G */
  77. {{'\x08',0},0x00000003,ed_ctrl_h,"バックスペース"},    /* ^H */
  78. {{'\x09',0},0x00000004,ed_ctrl_i,"タブ"},        /* ^I */
  79.  
  80. {{'\x0a','\x04',0},0x0000020f,ed_ctrl_j_ctrl_d,"再変換開始"},
  81. {{'\x0a','\x0c',0},0x00000008,ed_ctrl_j_ctrl_l,"アンダーライン"},
  82. {{'\x0a','\x12',0},0x00000008,ed_ctrl_j_ctrl_r,"アンダーライン消去"},
  83. {{'\x0a','\x13',0},0x0000000a,ed_ctrl_j_ctrl_s,"属性付セーブ"},
  84. {{'\x0a','\x14',0},0x0000000b,ed_ctrl_j_ctrl_t,"文字入れ替え"},
  85. {{'\x0a','\x17',0},0x0000000b,ed_ctrl_j_ctrl_w,"範囲削除"},    /* F7 */
  86. {{'\x0a','\x19',0},0x0000000b,ed_ctrl_j_ctrl_y,"貼付"},    /* F9 */
  87. {{'\x0a','\x1b','W',0},0x0000000b,ed_ctrl_j_esc_w,"複写"},    /* F8 */
  88. {{'\x0a','(',0},0x00000009,ed_ctrl_j_pair_left,"左ペア挿入"},
  89. {{'\x0a',')',0},0x00000009,ed_ctrl_j_pair_right,"右ペア挿入"},
  90.  
  91. {{'\x0a','2',0},0x0000000a,ed_ctrl_j_2,"二重化"},
  92. {{'\x0a','=',0},0x0000010a,ed_ctrl_j_equal,"カーソル位置情報"},
  93. {{'\x0a','A',0},0x00000108,ed_ctrl_j_a,"キーバインド一覧"},
  94. {{'\x0a','B','\r',0},0x0000000b,ed_ctrl_j_b,"バックアップモード切り替え"},
  95. {{'\x0a','C','L','I','C','K','\r',0},0x0000010b,ed_ctrl_j_click,"クリックON/OFF"},
  96. {{'\x0a','C','M','D','\r',0},0x00000118,ed_ctrl_j_cmd,"ED⇔ME切り替え"},
  97. {{'\x0a','D','E','V',0},0x00000018,ed_ctrl_j_dev,"デバイス書き出し"},
  98. {{'\x0a','D','M','\r',0},0x00000108,ed_ctrl_t_dm,"辞書の学習モード切り替え"},
  99. {{'\x0a','E',0},0x00000119,ed_ctrl_j_e,"マクロを実行"},
  100. {{'\x0a','H',0},0x0000010b,ed_ctrl_j_h,"ホーム"},
  101. {{'\x0a','L','\r',0},0x00000108,ed_ctrl_j_l,"下線開閉"},
  102. {{'\x0a','L','0','\r',0},0x00000108,ed_ctrl_j_l0,"下線閉じる"},
  103. {{'\x0a','L','1','\r',0},0x00000108,ed_ctrl_j_l1,"下線開ける"},
  104. {{'\x0a','M','E','\r',0},0x00000118,ed_ctrl_j_me,"MEモードにする"},
  105. {{'\x0a','N',0},0x0000010a,ed_ctrl_j_n,"次検索"},    /* F5 */
  106. {{'\x0a','P','\r',0},0x00000128,ed_ctrl_j_p,"印刷"},
  107. {{'\x0a','P','T','\r',0},0x00000128,ed_ctrl_j_pt,"縦書き印刷"},
  108. {{'\x0a','S','1',0},0x00000108,ed_ctrl_j_s1,"カットバッファよりワーク1へ"},
  109. {{'\x0a','S','2',0},0x00000108,ed_ctrl_j_s2,"カットバッファよりワーク2へ"},
  110. {{'\x0a','T',0},0x00000208,ed_ctrl_j_t,"範囲内再変換"},
  111. {{'\x0a','U','\r',0},0x00000108,ed_ctrl_j_u,"上線開閉"},
  112. {{'\x0a','U','0','\r',0},0x00000108,ed_ctrl_j_u0,"上線閉じる"},
  113. {{'\x0a','U','1','\r',0},0x00000108,ed_ctrl_j_u1,"上線開ける"},
  114. {{'\x0a','W','\r',0},0x0000010a,ed_ctrl_j_w,"上下線開閉"},
  115. {{'\x0a','W','0','\r',0},0x00000108,ed_ctrl_j_w0,"上下線閉じる"},
  116. {{'\x0a','W','1','\r',0},0x00000108,ed_ctrl_j_w1,"上線開/下線閉"},
  117. {{'\x0a','W','2','\r',0},0x00000108,ed_ctrl_j_w2,"上線閉/下線開"},
  118. {{'\x0a','W','3','\r',0},0x00000108,ed_ctrl_j_w3,"上下線開ける"},
  119.  
  120. {{'\x0b',0},0x0000000b,ed_ctrl_k,"行末まで削除"},    /* ^K */
  121. {{'\x0c',0},0x0000000b,ed_ctrl_l,"カットバッファより貼付"},    /* ^L */
  122. {{'\x0d',0},0x00000007,ed_ctrl_m,"改行"},        /* ^M */
  123. {{'\x0e',0},0x0000000f,ed_ctrl_n,"1行挿入"},        /* ^N */
  124. {{'\x0f',0},0x00000108,ed_ctrl_o,"辞書の学習モード変更"},    /* ^O */
  125.  
  126. {{'\x10',0},0x0000010b,ed_ctrl_p,"行の右端へ"},    /* ^P */
  127. {{'\x11',0},0x0000010b,ed_ctrl_q,"行の左端へ"},    /* ^Q */
  128.  
  129. {{'\x12',0},0x0000010b,ed_ctrl_r,"上ページスクロール"},    /* ^R */
  130. {{'\x13',0},0x00000103,ed_ctrl_s,"左へ"},        /* ^S */
  131.  
  132. {{'\x14',0},0x0000000f,ed_ctrl_t,"1ワード削除"},    /* ^T */
  133. {{'\x15',0},0x00000008,ed_ctrl_u,"行の左端からカーソルまで削除"},    /* ^U */
  134. {{'\x16',0},0x0000000b,ed_ctrl_v,"コントロールコード入力"},    /* ^V */
  135. {{'\x17',0},0x00000109,ed_ctrl_w,"張り付き下スクロール"},    /* ^W */
  136.  
  137. {{'\x18',0},0x00000103,ed_ctrl_x,"下へ"},            /* ^X */
  138. {{'\x19',0},0x0000000b,ed_ctrl_y,"1行削除"},
  139. {{'\x1a',0},0x0000010b,ed_ctrl_z,"張り付き上スクロール"},    /* ^Z */
  140.  
  141. {{'\x1b','\x07',0},0x00000108,ed_meta_ctrl_g,"マークジャンプ"},
  142. {{'\x1b','\x0c',0},0x00000109,ed_meta_ctrl_l,"カーソル中央"},
  143. {{'\x1b','\x16',0},0x00000103,ed_meta_ctrl_v,"次ウインドウ次頁"},
  144. {{'\x1b','\x17',0},0x0000000a,ed_meta_ctrl_w,"字詰め改行書き出し"},
  145.  
  146. {{'\x1b','\x18','\x02',0},0x00000108,ed_ctrl_x_ctrl_b,"バッファの一覧"},
  147. {{'\x1b','\x18','\x09',0},0x0000000a,ed_ctrl_x_ctrl_i,"挿入ファイル読み込み"},
  148. {{'\x1b','\x18','\x0c',0},0x0000000a,ed_ctrl_x_ctrl_l,"指定範囲小文字へ"},
  149. {{'\x1b','\x18','\x0e',0},0x0000010b,ed_ctrl_x_ctrl_n,"張り付き上スクロール"},
  150. {{'\x1b','\x18','\x10',0},0x0000010b,ed_ctrl_x_ctrl_p,"張り付き下スクロール"},
  151. {{'\x1b','\x18','\x15',0},0x0000000a,ed_ctrl_x_ctrl_u,"指定範囲大文字へ"},
  152. {{'\x1b','\x18','\x18',0},0x00000108,ed_ctrl_x_ctrl_x,"カーソル⇔マーク交換"},
  153. {{'\x1b','\x18','\x1a',0},0x00000108,ed_ctrl_x_ctrl_z,"ウインドウ縮小"},
  154. {{'\x1b','\x18',' ',0},0x00000108,ed_ctrl_x_space,"マークの解除"},
  155. {{'\x1b','\x18','$',0},0x00000109,ed_ctrl_x_doller,"チャイルド(直接)"},
  156. {{'\x1b','\x18','0',0},0x00000109,ed_ctrl_x_0,"現在のウインドウを消す"},
  157. {{'\x1b','\x18','1',0},0x00000109,ed_ctrl_x_1,"現在以外のウインドウを消す"},
  158. {{'\x1b','\x18','2',0},0x00000108,ed_ctrl_x_2,"現在のウインドウを2分割"},
  159. {{'\x1b','\x18','B',0},0x00000108,ed_ctrl_x_b,"前バッファ"},
  160. {{'\x1b','\x18','K',0},0x00000108,ed_ctrl_x_k,"バッファの削除"},
  161. {{'\x1b','\x18','N',0},0x00000008,ed_ctrl_x_n,"ファイル名変更"},
  162. {{'\x1b','\x18','O',0},0x00000109,ed_ctrl_x_o,"後のウインドウへ"},
  163. {{'\x1b','\x18','P',0},0x00000109,ed_ctrl_x_p,"前のウインドウへ"},
  164. {{'\x1b','\x18','^',0},0x00000108,ed_ctrl_x_up_arrow,"ウインドウの拡大"},
  165.  
  166. {{'\x1b','\x1a',0},0x00000103,ed_meta_ctrl_z,"次ウインドウ前頁"},
  167. {{'\x1b','\x1b',0},0x00000108,ed_ctrl_j_equal,"カーソル位置情報"},
  168. {{'\x1b',' ',0},0x00000108,ed_meta_space,"マークセット"},    /* ,,, */
  169. {{'\x1b','.',0},0x00000108,ed_meta_space,"マークセット"},
  170. {{'\x1b','0',0},0x00000108,ed_meta_arg0,"アーギュメント"},
  171. {{'\x1b','1',0},0x00000108,ed_meta_arg1,"アーギュメント"},
  172. {{'\x1b','2',0},0x00000108,ed_meta_arg2,"アーギュメント"},
  173. {{'\x1b','3',0},0x00000108,ed_meta_arg3,"アーギュメント"},
  174. {{'\x1b','4',0},0x00000108,ed_meta_arg4,"アーギュメント"},
  175. {{'\x1b','5',0},0x00000108,ed_meta_arg5,"アーギュメント"},
  176. {{'\x1b','6',0},0x00000108,ed_meta_arg6,"アーギュメント"},
  177. {{'\x1b','7',0},0x00000108,ed_meta_arg7,"アーギュメント"},
  178. {{'\x1b','8',0},0x00000108,ed_meta_arg8,"アーギュメント"},
  179. {{'\x1b','9',0},0x00000108,ed_meta_arg9,"アーギュメント"},
  180.  
  181. {{'\x1b','@',0},0x00000108,ed_meta_at,"マクロ定義開始/終了"},        /* meta-AT */
  182. {{'\x1b','A',0},0x00000109,ed_meta_a,"ファイル切り替え(正順)"},    /* meta-A */
  183. {{'\x1b','B',0},0x00000109,ed_meta_b,"文頭へ"},            /* meta-B */
  184. {{'\x1b','C',0},0x00000108,ed_meta_c,"コマンドを実行"},        /* meta-C */
  185. {{'\x1b','D',0},0x00000109,ed_meta_d,"ファイル切り替え(逆順)"},    /* meta-D */
  186. {{'\x1b','E',0},0x00000008,ed_meta_e,"セーブして終了"},        /* meta-E */
  187. {{'\x1b','F',0},0x00000108,ed_meta_f,"新しいファイルの編集"},    /* meta-F */
  188. {{'\x1b','H',0},0x00000008,ed_meta_h,"セーブ"},            /* meta-H */
  189. {{'\x1b','I',0},0x00000108,ed_meta_i,"タブ表示の切替"},        /* meta-I */
  190. {{'\x1b','J',0},0x00000008,ed_meta_j,"文末への確認置換"},        /* meta-J */
  191. {{'\x1b','K',0},0x00000109,ed_meta_k,"現ファイルを編集前の状態で終了"},/* meta-K */
  192. {{'\x1b','L',0},0x00000008,ed_meta_l,"文頭に向かって確認置換"},    /* meta-L */
  193. {{'\x1b','M',0},0x00000108,ed_meta_m,"改行記号の表示切り替え"},    /* meta-M */
  194. {{'\x1b','N',0},0x00000108,ed_meta_n,"文末へ向かって文字列検索"},    /* meta-N */
  195. {{'\x1b','O',0},0x00000108,ed_meta_o,"現ファイルを編集前に戻す"},    /* meta-O */
  196. {{'\x1b','Q',0},0x00000109,ed_meta_q,"終了"},            /* meta-Q */
  197. {{'\x1b','R',0},0x00000008,ed_meta_r,"置換"},            /* meta-R */
  198. {{'\x1b','S',0},0x00000108,ed_meta_s,"文頭に向かって文字列検索"},    /* meta-S */
  199. {{'\x1b','T',0},0x0000000c,ed_meta_t,"ファイル名変更"},        /* meta-T */
  200. {{'\x1b','U',0},0x00000008,ed_meta_u,"文頭に向かって連続置換"},    /* meta-U */
  201. {{'\x1b','V',0},0x00000108,ed_meta_v,"タグジャンプ"},        /* meta-V */
  202. {{'\x1b','W',0},0x00000008,ed_meta_w,"一部取り出しファイル作成"},    /* meta-W */
  203. {{'\x1b','X',0},0x00000008,ed_meta_x,"現ファイルをセーブ、次へ"},    /* meta-X */
  204. {{'\x1b','Y',0},0x00000008,ed_meta_y,"挿入ファイル読み込み"},        /* meta-Y */
  205. {{'\x1b','Z',0},0x0000010b,ed_meta_z,"文末へ"},            /* meta-Z */
  206. {{'\x1b',']',0},0x00000008,ed_meta_KO,"大/小文字変換モードのトグル"},/* meta-] */
  207. {{'\x1b','n','\r',0},0x00000108,ed_nop,"第n行へ移動"},    /* !!! never match */
  208. {{'\x1b','n','\x09',0},0x00000108,ed_nop,"タブ数を設定"},    /* !!! never match */
  209. {{'\x1b','n','F',0},0x00000108,ed_nop,"カラム数設定"},    /* !!! never match */
  210.  
  211. {{'\x1d',0},0x00000009,ed_ctrl_KO,"大/小文字変換"},        /* ctrl-] */
  212. {{'\x1f',0},0x00000000,ed_ctrl_ubar,"生入力キャンセル"}};
  213.  
  214. COMMAND_UNIT command_table00[MAX_COMMAND_NUMBER] = {
  215. {{'\x00',0},0x0000000b,ctrl_at,"なし"},
  216. {{0x201,0},0x0000010b,meta_left_blaket,"文頭へ"},
  217. {{0x202,0},0x0000010b,meta_right_blaket,"文末へ"},
  218. {{0x203,0},0x00000008,meta_r,"置換"},
  219. {{0x204,0},0x0000010a,ctrl_s,"検索"},
  220. {{0x205,0},0x0000014a,ctrl_s_next,"次検索"},
  221. {{0x206,0},0x00000108,meta_space,"マークセット"},
  222. {{0x207,0},0x00000009,ctrl_w,"範囲削除"},
  223. {{0x208,0},0x00000108,meta_w,"カットバッファへ転写"},
  224. {{0x209,0},0x0000000a,ctrl_y,"貼り付け"},
  225. {{0x20a,0},0x00000009,meta_z,"セーブして終了"},
  226. {{0x210,0},0x00000108,mouse_cursor,"マウスでカーソル移動"},
  227. {{0x211,0},0x00000108,ctrl_x_up_arrow,"ウインドウを拡大"},
  228. {{0x212,0},0x00000108,ctrl_x_ctrl_z,"現ウインドウを縮小"},
  229. {{0x213,0},0x00000008,meta_ctrl_r,"確認置換"},
  230. {{0x214,0},0x0000010a,ctrl_r,"逆方向検索"},
  231. {{0x215,0},0x0000014a,ctrl_r_next,"逆方向次検索"},
  232. #if 0
  233. {{0x216,0},0x00000100,etc_ds,""},/* ,,, */
  234. {{0x217,0},0x00000100,etc_ds1,""},/* ,,, */
  235. #endif
  236.  
  237. {{FEP_CLR_CODE,0},0x00000000,ctrl_ubar,"生入力キャンセル"},
  238. {{FEP_UNDO_CODE,0},0x00000159,ctrl_x_e,"マクロを実行"},
  239. {{FEP_HELP_CODE,0},0x00000118,ctrl_t_h,"ヘルプ"},
  240. {{FEP_HOME_CODE,0},0x00000109,ctrl_x_o,"後のウインドウへ"},
  241. {{FEP_HELP_CODE | 0x20,0},0x00000118,ctrl_shift_help,"キーバインド初期化"},
  242.  
  243. {{'\x01',0},0x0000010b,ctrl_a,"行頭へ"},
  244. {{'\x02',0},0x00000103,ctrl_b,"左へ"},
  245. {{'\x03',0},0x0000000f,ctrl_c,"右にスペース"},
  246. {{'\x04',0},0x0000000b,ctrl_d,"吸い込み削除"},
  247. {{'\x05',0},0x0000010b,ctrl_e,"行末へ"},
  248. {{'\x06',0},0x00000103,ctrl_f,"右へ"},
  249. {{'\x07',0},0x00000100,ctrl_g,"中断"},
  250. {{'\x08',0},0x00000003,ctrl_h,"左へ削除"},
  251. {{'\x09',0},0x00000004,ctrl_i,"タブ"},
  252. {{'\x0a',0},0x00000007,ctrl_j,"インデント付き改行"},
  253. {{'\x0b',0},0x0000000b,ctrl_k,"行末まで削除"},
  254. {{'\x0c',0},0x0000010b,ctrl_l,"画面を描き直す"},
  255. {{'\x0d',0},0x00000007,ctrl_m,"改行"},
  256. {{'\x0e',0},0x00000103,ctrl_n,"下へ"},
  257. {{'\x0f',0},0x0000000f,ctrl_o,"行を開ける"},
  258. {{'\x10',0},0x00000103,ctrl_p,"上へ"},
  259. {{'\x11',0},0x0000000b,ctrl_q,"コントロールコード入力"},
  260. {{'\x12',0},0x0000010a,ctrl_r,"逆方向検索"},
  261. {{'\x13',0},0x0000010a,ctrl_s,"検索"},
  262.  
  263. {{'\x14','\x06',0},0x0000020f,ctrl_t_ctrl_f,"再変換開始"},
  264. {{'\x14','\x09',0},0x00000109,ctrl_t_ctrl_i,"TAB の表示切り替え"},
  265. {{'\x14','\x0c',0},0x00000008,ctrl_t_ctrl_l,"アンダーライン"},
  266. {{'\x14','\x0d',0},0x00000109,ctrl_t_ctrl_m,"改行の表示切り替え"},
  267. {{'\x14','\x12',0},0x00000008,ctrl_t_ctrl_r,"アンダーライン消去"},
  268. {{'\x14','\x13',0},0x00000008,ctrl_t_ctrl_s,"情報付セーブ"},
  269. {{'\x14','\x14',0},0x0000000b,ctrl_t_ctrl_t,"入れ替え"},
  270. {{'\x14','\x17',0},0x0000000a,ctrl_t_ctrl_w,"字詰め改行書き出し"},
  271. {{'\x14','(',0},0x00000009,ctrl_t_pair_left,"左ペア挿入"},
  272. {{'\x14',')',0},0x00000009,ctrl_t_pair_right,"右ペア挿入"},
  273. {{'\x14','B','\r',0},0x0000000b,ctrl_t_b,"バックアップモード切り替え"},
  274. {{'\x14','C','L','I','C','K','\r',0},0x0000010b,ctrl_t_click,"クリック切り替え"},
  275. {{'\x14','C','M','D','\r',0},0x00000118,ctrl_t_cmd,"ED⇔ME"},
  276. {{'\x14','D','E','V',0},0x00000018,ctrl_t_dev,"デバイス書き出し"},
  277. {{'\x14','D','M','\r',0},0x00000108,ctrl_t_dm,"辞書の学習モード切り替え"},
  278. {{'\x14','E','D','\r',0},0x00000118,ctrl_t_ed,"EDモードにする"},
  279. {{'\x14','H',0},0x00000118,ctrl_t_h,"ヘルプ"},
  280. {{'\x14','L','\r',0},0x00000108,ctrl_t_l,"下線開閉"},
  281. {{'\x14','L','0','\r',0},0x00000108,ctrl_t_l0,"下線閉じる"},
  282. {{'\x14','L','1','\r',0},0x00000108,ctrl_t_l1,"下線開ける"},
  283. {{'\x14','P','A','G','E','\r',0},0x0000010c,ctrl_t_PAGE,"ページ長さ設定"},
  284. {{'\x14','P','\r',0},0x00000128,ctrl_t_p,"印刷"},
  285. {{'\x14','P','T','\r',0},0x00000128,ctrl_t_pt,"縦書き印刷"},
  286. {{'\x14','S','1',0},0x00000108,ctrl_t_s1,"カットバッファよりワーク1へ"},
  287. {{'\x14','S','2',0},0x00000108,ctrl_t_s2,"カットバッファよりワーク2へ"},
  288. {{'\x14','T',0},0x00000208,ctrl_t_t,"範囲内再変換"},
  289. {{'\x14','U','\r',0},0x00000108,ctrl_t_u,"上線開閉"},
  290. {{'\x14','U','0','\r',0},0x00000108,ctrl_t_u0,"上線閉じる"},
  291. {{'\x14','U','1','\r',0},0x00000108,ctrl_t_u1,"上線開ける"},
  292. {{'\x14','V',0},0x00000108,ctrl_t_v,"タグジャンプ"},
  293. {{'\x14','W','\r',0},0x00000108,ctrl_t_w,"上下線開閉"},
  294. {{'\x14','W','0','\r',0},0x00000108,ctrl_t_w0,"上下線閉じる"},
  295. {{'\x14','W','1','\r',0},0x00000108,ctrl_t_w1,"上線開/下線閉"},
  296. {{'\x14','W','2','\r',0},0x00000108,ctrl_t_w2,"上線閉/下線開"},
  297. {{'\x14','W','3','\r',0},0x00000108,ctrl_t_w3,"上下線開ける"},
  298.  
  299. {{'\x15',0},0x00000108,ctrl_u,"実行回数指定"},
  300. {{'\x16',0},0x0000010b,ctrl_v,"下ページスクロール"},
  301. {{'\x17',0},0x00000009,ctrl_w,"範囲削除"},
  302.  
  303. {{'\x18','\x02',0},0x00000108,ctrl_x_ctrl_b,"バッファの一覧"},
  304. {{'\x18','\x03',0},0x00000109,ctrl_x_ctrl_c,"終了"},
  305. {{'\x18','\x06',0},0x0000010a,ctrl_x_ctrl_f,"ファイル読み込み"},
  306. {{'\x18','\x09',0},0x0000000a,ctrl_x_ctrl_i,"挿入ファイル読み込み"},
  307. {{'\x18','\x0c',0},0x0000000a,ctrl_x_ctrl_l,"指定範囲小文字へ"},
  308. {{'\x18','\x0e',0},0x0000010b,ctrl_x_ctrl_n,"張り付き上スクロール"},
  309. {{'\x18','\x0f',0},0x00000009,ctrl_x_ctrl_o,"空行削除"},
  310. {{'\x18','\x10',0},0x0000010b,ctrl_x_ctrl_p,"張り付き下スクロール"},
  311. {{'\x18','\x12',0},0x00000008,ctrl_x_ctrl_r,"文頭に向かって確認置換"},
  312. {{'\x18','\x13',0},0x00000008,ctrl_x_ctrl_s,"情報無しセーブ"},
  313. {{'\x18','\x15',0},0x0000000a,ctrl_x_ctrl_u,"指定範囲大文字へ"},
  314. {{'\x18','\x17',0},0x00000008,ctrl_x_ctrl_w,"ファイル書き出し"},
  315. {{'\x18','\x18',0},0x00000108,ctrl_x_ctrl_x,"カーソル⇔マーク交換"},
  316. {{'\x18','\x1a',0},0x00000108,ctrl_x_ctrl_z,"現ウインドウを縮小"},
  317. {{'\x18',' ',0},0x00000108,ctrl_x_space,"マークの解除"},
  318. {{'\x18','$',0},0x00000109,ctrl_x_doller,"チャイルド(直接)"},
  319. {{'\x18','!',0},0x00000109,ctrl_x_gyo,"コマンドを実行"},
  320. {{'\x18','(',0},0x00000118,ctrl_x_left_braket,"マクロ記録開始"},
  321. {{'\x18',')',0},0x00000108,ctrl_x_right_braket,"マクロ記録終了"},
  322. {{'\x18','0',0},0x00000109,ctrl_x_0,"現ウインドウを消す"},
  323. {{'\x18','1',0},0x00000109,ctrl_x_1,"現ウインドウ以外を消す"},
  324. {{'\x18','2',0},0x00000108,ctrl_x_2,"ウインドウを2分割"},
  325. {{'\x18','=',0},0x00000108,ctrl_x_equal,"レポート"},
  326. {{'\x18','B',0},0x00000108,ctrl_x_b,"前バッファ"},
  327. {{'\x18','C',0},0x00000109,ctrl_x_c,"シェルを起動"},
  328. {{'\x18','E',0},0x00000119,ctrl_x_e,"マクロを実行"},
  329. {{'\x18','F',0},0x00000108,ctrl_x_f,"カラム数設定"},
  330. {{'\x18','K',0},0x00000108,ctrl_x_k,"バッファの削除"},
  331. {{'\x18','N',0},0x00000008,ctrl_x_n,"ファイル名変更"},
  332. {{'\x18','O',0},0x00000109,ctrl_x_o,"後のウインドウへ"},
  333. {{'\x18','P',0},0x00000109,ctrl_x_p,"前のウインドウへ"},
  334. {{'\x18','R',0},0x00000008,ctrl_x_r,"文頭に向かって連続置換"},
  335. {{'\x18','W',0},0x00000108,ctrl_x_w,"ウインドウの行数設定"},
  336. {{'\x18','X',0},0x00000109,ctrl_x_x,"ファイル切り替え(昇順)"},
  337. {{'\x18','^',0},0x00000108,ctrl_x_up_arrow,"ウインドウの拡大"},
  338.  
  339. {{'\x19',0},0x0000000b,ctrl_y,"貼り付け"},
  340. {{'\x1a',0},0x0000010b,ctrl_z,"上ページスクロール"},    /* 上ページ */
  341.  
  342. {{'\x1b','\x07',0},0x00000108,meta_ctrl_g,"マークジャンプ"},
  343. {{'\x1b','\x08',0},0x00000008,meta_ctrl_h,"左1ワード削除"},
  344. {{'\x1b','\x0c',0},0x00000109,meta_ctrl_l,"カーソル中央"},
  345. {{'\x1b','\x12',0},0x00000008,meta_ctrl_r,"確認置換"},
  346. {{'\x1b','\x16',0},0x00000103,meta_ctrl_v,"次ウインドウ次頁"},
  347. {{'\x1b','\x1a',0},0x00000103,meta_ctrl_z,"次ウインドウ前頁"},
  348. {{'\x1b','\x1b',0},0x00000108,ctrl_x_equal,"レポート"},
  349. {{'\x1b',' ',0},0x00000108,meta_space,"マークセット"},
  350. {{'\x1b','.',0},0x00000108,meta_space,"マークセット"},
  351. {{'\x1b','0',0},0x00000108,meta_arg0,"アーギュメント"},
  352. {{'\x1b','1',0},0x00000108,meta_arg1,"アーギュメント"},
  353. {{'\x1b','2',0},0x00000108,meta_arg2,"アーギュメント"},
  354. {{'\x1b','3',0},0x00000108,meta_arg3,"アーギュメント"},
  355. {{'\x1b','4',0},0x00000108,meta_arg4,"アーギュメント"},
  356. {{'\x1b','5',0},0x00000108,meta_arg5,"アーギュメント"},
  357. {{'\x1b','6',0},0x00000108,meta_arg6,"アーギュメント"},
  358. {{'\x1b','7',0},0x00000108,meta_arg7,"アーギュメント"},
  359. {{'\x1b','8',0},0x00000108,meta_arg8,"アーギュメント"},
  360. {{'\x1b','9',0},0x00000108,meta_arg9,"アーギュメント"},
  361. {{'\x1b','<',0},0x0000010b,meta_left_blaket,"文頭へ"},
  362. {{'\x1b','>',0},0x0000010b,meta_right_blaket,"文末へ"},
  363. {{'\x1b','A',0},0x00000108,meta_a,"キーバインド一覧"},
  364. {{'\x1b','B',0},0x0000010b,meta_b,"1ワード左へ"},
  365. {{'\x1b','C',0},0x0000000b,meta_c,"ケース大文字へ"},
  366. {{'\x1b','D',0},0x0000000b,meta_d,"右1ワード削除"},
  367. {{'\x1b','F',0},0x0000010b,meta_f,"1ワード右へ"},
  368. {{'\x1b','G',0},0x00000109,meta_g,"第n行へ移動"},
  369. {{'\x1b','L',0},0x0000000b,meta_l,"1ワード小文字へ"},
  370. {{'\x1b','R',0},0x00000008,meta_r,"置換"},
  371. {{'\x1b','U',0},0x0000000b,meta_u,"1ワード大文字へ"},
  372. {{'\x1b','V',0},0x0000010b,meta_v,"上ページスクロール"},
  373. {{'\x1b','W',0},0x00000108,meta_w,"カットバッファへ転写"},
  374. {{'\x1b','Z',0},0x00000009,meta_z,"セーブして終了"},
  375. {{'\x1b','~',0},0x0000000b,meta_upper_bar,"変更フラグを取り消す"},
  376. {{'\x1b','n','\x09',0},0x00000108,ed_nop,"タブ数を設定"},    /* !!! never matck */
  377. {{'\x1f',0},0x00000000,ctrl_ubar,"生入力キャンセル"}};
  378.  
  379. int
  380. commander0()
  381. {
  382.     register UINT c,i,j,n;
  383.     int flag;
  384.     UWORD cs[MAX_COMMAND_STROKE];
  385.  
  386.     *cs = EOS;
  387.     i = 0;
  388.     while(1) {
  389.         while(!(c = fep_inkey_command(i)));    /* コマンドであることをにらみつつ入力 */
  390.         for(flag = n = 0;n < MAX_COMMAND_NUMBER;n++) {
  391.             for(j = 0;j < i;j++) {
  392.                 if (cs[j] != command_table[n].COMMAND_STRING[j]) {
  393.                     break;
  394.                 }
  395.             }
  396.             if (i == j) {    /* 直前までマッチした */
  397.                 if (c == command_table[n].COMMAND_STRING[i]) {    /* ここまで一致した */
  398.                     if (command_table[n].COMMAND_STRING[i+1]){
  399.                         flag = 1;    /* まだマッチしていない */
  400.                     } else {
  401.                         return(n);    /* マッチでーす */
  402.                     }
  403.                 }
  404.             }
  405.         }
  406.         if (flag) {    /* 未決につき続行 */
  407.             if (!i) {
  408.  
  409.                 if (c == '['-'@') {
  410.                     if (CMDMOD) {
  411.                         under_blanc();
  412.                         window_abs_loc(0,UNDER_Y);
  413.                         etc_color(KIIRO_REV);
  414.                         B_PRINT(" ESC ");
  415.                         etc_color(NORMAL);
  416.                         work_cursor_cpx();
  417.                         commander_x = 10;
  418.                     } else {
  419.                         under_print((STR)"[META]");
  420.                         commander_x = 6;
  421.                     }
  422.                 } else {
  423.                     UBYTE um[MAXLINE];
  424.  
  425.                     sprintf(um,"[CTRL-%c]",c+'@');
  426.                     under_print((STR) um);
  427.                     commander_x = 8;
  428.                 }
  429.             } else {    /* i >= 1 */
  430.                 if (c >= 0x20) {
  431.                     under_print_x(commander_x,(UBYTE)'-');
  432.                     under_print_x(commander_x+1,c);
  433.                     commander_x += 2;
  434.                 } else {
  435.                     under_print_x(commander_x,(UBYTE)'-');
  436.                     under_print_x(commander_x+1,(UBYTE)'^');
  437.                     under_print_x(commander_x+2,c+'@');
  438.                     commander_x += 3;
  439.                 }
  440.             }
  441.             cs[i++] = c;
  442.         } else {
  443.             if (!i) {    /* i は0である */
  444.                     /* 文字の入力、もしくはファンクションキー */
  445.                 return(c+MAX_COMMAND_NUMBER);    /* ゲタをはかせて返る */
  446.             } else {    /* 未定義のコマンドストロークであった */
  447.                 return(-1);
  448.             }
  449.         }
  450.     }
  451. }
  452.  
  453. void
  454. commander()
  455. {
  456.     register int cn,a;
  457.     register int code;
  458.     register UINT CF;
  459.  
  460.     if ((cn = commander0()) >= 0) {        /* 有効なコマンドを得た */
  461.         if (cn < MAX_COMMAND_NUMBER) {    /* コマンドである */
  462. /*
  463. window0();
  464. printf("%d",cn);
  465. binkey();
  466. */
  467.             CF = command_table[cn].COMMAND_FLAG;
  468. /*            if ((TBUFFC || TBUFFC_R) && (CF & TTIME_MASK) && !view_flag) {*/
  469.             if ((TBUFFC || TBUFFC_R) && (CF & TTIME_MASK)) {
  470.                 /* 変換中は実行しては行けないコマンドである */
  471.                 under_print((STR)"確定してから実行して下さい");
  472.                 fep_key_clear();
  473.                 CF = 0;
  474.                 return;
  475.             }
  476.             if ((CF & MACRO_NOT_MASK) && MACRO_DEF_FLAG) {
  477.                     /* マクロで実行してはいけない */
  478.                 MACRO_SEQUENCE[0] = 0;
  479.                 MACRO_COUNT = MACRO_DEF_FLAG = 0;
  480.                 etc_beep();
  481.                 under_print((STR)"マクロに含まれてはいけないコマンドです");
  482.                 return;
  483.             }
  484.             if (!(CF & OK_VIEW) && view_flag) {    /* view で実行してはいけないコマンドである */
  485.                 etc_beep();
  486.                 under_print((STR)"[このバッファは編集できません]");
  487.                 xf_init_tb();
  488.                 return;
  489.             }
  490.             if ((CF & NO_DUMMY) && DUM_FLAG) {    /* dummy で実行してはいけないコマンドである */
  491.                 etc_beep();
  492.                 under_print((STR)"[ダミーモードでは実行できません]");
  493.                 return;
  494.             }
  495.  
  496.             disp_cursor_off();    /* カーソルを消す */
  497.             (*command_table[cn].FUNCTION)();
  498.             commander_do_CF(CF);
  499.             fep_key_clear();    /* キーバッファのクリア:バッファはクリアしない */
  500.             if (a = etc_get_arg()) {    /* 回数指定! */
  501.                 if ((cn = commander0()) >= 0) {/* 有効なコマンドを得た */
  502.                     if (cn < MAX_COMMAND_NUMBER) {/* コマンドである */
  503.                         CF = command_table[cn].COMMAND_FLAG;
  504.                         if (CF & COMMAND_ARG_LOOP_MASK) {
  505.                         /* コマンドである、かつループ者 */
  506.                             under_print((STR)"[ESC] もしくは [CTRL-G] で中止");
  507.                             for(;a > 0;a--) {
  508.                                 if (((code = fep_get_key()) == '['-'@') ||
  509.                                 (code == 'G'-'@')) {
  510.                                     ctrl_g();
  511.                                     break;
  512.                                 }
  513.                                 (*command_table[cn].FUNCTION)();
  514.                                 commander_do_CF(CF);
  515.                             }
  516.                             if (!code) {    /* 中断した */
  517.                                 under_blanc();
  518.                             }
  519.                         } else {
  520.                             etc_push_arg(a);/* アーギュメントを戻す */
  521.                             (*command_table[cn].FUNCTION)();/* 実行 */
  522.                             commander_do_CF(CF);
  523.                         }
  524.                     } else {    /* 文字列の挿入である */
  525.             if (view_flag) {
  526.                 etc_beep();
  527.                 under_print((STR)"[このバッファは編集できません]");
  528.                 xf_init_tb();
  529.             } else {
  530.  
  531.                         cn -= MAX_COMMAND_NUMBER;    /* ゲタを脱がせる */
  532.                         if (cn < 0x100) {        /* 普通の1バイトコード */
  533.                             under_print((STR)"[ESC] もしくは [CTRL-G] で中止");
  534.                             for(;a > 0;a--) {
  535.                                 if (((code = fep_get_key()) == '['-'@') ||
  536.                                 (code == 'G'-'@')) {
  537.                                 ctrl_g();
  538.                                 break;
  539.                             }
  540.                             work_insert1(cn);
  541.                         }
  542.                         if (!code) {    /* 中断した */
  543.                             under_blanc();
  544.                         }
  545.                     } else if (cn >= 0x8000) {    /* 2バイトコード */
  546.                         under_print((STR)"[ESC] もしくは [CTRL-G] で中止");
  547.                         for(;a > 0;a--) {
  548.                             if (((code = fep_get_key()) == '['-'@') ||
  549.                             (code == 'G'-'@')) {
  550.                                 ctrl_g();
  551.                                 break;
  552.                             }
  553.                             work_insert2(cn);
  554.                         }
  555.                         if (!code) {    /* 中断した */
  556.                         under_blanc();
  557.                         }
  558.                     }
  559.             }
  560.                     work_cursor_cpx();
  561.                 }
  562.             } else {
  563.                 under_print((STR)"[未定義キーです]");
  564.                 etc_beep();
  565.             }
  566.         }
  567.         work_cursor_cpx();
  568.         disp_cursor_on();    /* カーソルを出す */
  569.         disp_show_cursor();    /* カーソルのブリンクを強制的にオンにする */
  570.         } else {    /* 文字列の挿入である,,, */
  571.             if (view_flag) {
  572.                 etc_beep();
  573.                 under_print((STR)"[このバッファは編集できません]");
  574.                 xf_init_tb();
  575.             } else {
  576.             cn -= MAX_COMMAND_NUMBER;    /* ゲタを脱がせる */
  577.             if (cn < 0x100) {        /* 普通の1バイトコード */
  578.                 if (SP_XFER && TBUFFC && (cn == ' ')) {
  579.                     xf(0x103);
  580.                 } else {
  581.                     work_insert1(cn);
  582.                     change_check();
  583.                 }
  584.             } else if (cn >= 0x8000) {    /* 2バイトコード */
  585.                 if (SP_XFER && TBUFFC && (cn == L' ')) {
  586.                     xf(0x103);
  587.                 } else {
  588.                     work_insert2(cn);
  589.                     change_check();
  590.                 }
  591.             } else {            /* ファンクション or XF */
  592.                 if (cn < MAX_XF) {
  593.                     cn = fep_xf_bind_table[cn];
  594.                 }
  595.                 xf(cn);
  596.             }
  597.             }
  598.             work_cursor_cpx();
  599.         }
  600.     } else {
  601.         under_print((STR)"[未定義キーです]");
  602.         etc_beep();
  603.     }
  604.     LCN = cn;
  605. }
  606.  
  607. int
  608. commander_is_last_cut_buff_type()
  609. {
  610.     return(((0 <= LCN) && (LCN < MAX_COMMAND_NUMBER)) &&
  611.                             /* 直前が有効なコマンドであった */
  612.         ((command_table[LCN].FUNCTION == ctrl_k) || /* そして ctrl_k か */
  613.          (command_table[LCN].FUNCTION == ctrl_w) || /* ctrl_w か */
  614.          (command_table[LCN].FUNCTION == meta_w)));    /* meta_w か */
  615. }
  616.  
  617. void
  618. commander_do_CF(UINT CF)
  619. {
  620.     if (CF & COMMAND_UNDER_BLANC_MASK) {
  621.         under_blanc();
  622.     }
  623.     if (CF & CHANGED_FLAG_MASK) {
  624.         change_check();
  625.     }
  626.     if (CF & DO_CTRL_L) {    /* 実行後に ctrl_l */
  627.         ctrl_l();
  628.     }
  629.     if (CF & DO_KEY_CLEAR) {    /* 実行後に fep_eky_clear */
  630.         fep_key_clear();
  631.         etc_while_fep_qxf();
  632.     }
  633. }
  634.  
  635.